// Copied & Modified by ITokarev
// Проброс параметров аяксом + установка адреса запроса

$(function() {
	// Собираем параметры для вставки во вьюху,
	// а так же обновляем адрес
	var load = function(container, ajaxHref, href) {
		history.pushState({ container : container, ajaxHref : ajaxHref }, null,
			href);
		$(container).load(ajaxHref, function(response, status, xhr) {
		});
	};

	// Обработчик формы поиска,
	// пока что срабатывает на submit.
	$('form.active-crud-form').submit(
		function(e) {
			e.preventDefault();

			var $this = $(this);

			// сериализация массива
			var data = $this.serializeArray();

			// Устанавливаем обработчик формы,
			// исходя из html-аттрибута "action" у формы
			var action = $this.attr('action') ? $this.attr('action')
				: window.location.pathname;

			// Отправляем данные аяксом.
			// При успехе парсим данные,
			// вызываем функцию load() и наполняем ее параметрами
			$.ajax({ 'type' : 'POST', 'url' : action, 'data' : data }).done(
				function(data) {
					var json = $.parseJSON(data);
					// Заменяем пробелы в запросе / адресе на %20
					// TODO: нетут эта хрень
					var hrefFix = json.href
						.replace(new RegExp(" ", 'g'), '%20');
					var ajaxHrefFix = json.ajaxHref.replace(
						new RegExp(" ", 'g'), '%20');
					// Вызываем самописную функцию load и пихаем в нее параметры
					// Не путать с jQuery.load();
					load(json.ajaxContainer, ajaxHrefFix, hrefFix);
				});
		});

	var App = Backbone.Router
		.extend({

			activeModal : null,

			closeWithOutNavigate : null,

			$modalContainer : null,

			initialize : function(options) {
				var that = this;
				this.$modalContainer = $('#modal-container');
				this.$modalContainer.on('hidden.bs.modal', function(e) {

					if (!that.closeWithOutNavigate) {
						crudApp.navigate('!', { trigger : true, replace : true });
						that.activeModal = null;
					}

				});

				// вешаем пересчитывалку размеров модала
				this.$modalContainer.on('shown.bs.modal', function(e) {
					that.calculateMaxModalHeight(that.$modalContainer);
				});

				// вешаем на сабмиты модальных форм свой обработчик
				this.$modalContainer.on('submit', 'form.crud-ajax-form', function(e) {

//					if ($(this).hasClass('custom-submit')) {
//						e.preventDefault();
//
//						return;
//					}

					that.ajaxSubmit(this);

					e.preventDefault(); // STOP default action
					if ($.isFunction(e.unbind)) {
						e.unbind(); // unbind. to stop multiple form submit.
					}
				});
			},

			routes : { '' : 'empty', '!' : 'empty',
			'crud-:action=:id' : 'onForm',
			'crud-:action' : 'onForm'},

			empty : function() {
				// только чистим
				this.closeModal();
			},

			onForm : function(type, id) {

				if (!this.checkModal(type + id)) {

					var url = '/' + type.replace(/-/g, '/');

					if (undefined !== id) {
						url += '?id=' + id;
					}

					this.openAjaxModal(type + id, url, function() {
						window.init();
						// что-то делаем когда модал загружен и открыт
					});
				}
			},

			openAjaxModal : function(modal, url, callback) {
				var that = this;
				// запускаем прелоадер

				$.ajax(url).done(function(html) {
					that.openModal(modal, html);
					// еще неплохо было бы повесить на закрытие модала изменение
					// адреса (navigate (router))
					callback();
				}).fail(function() {
					// тут надо как-то выругаться поприличней
					$(document).trigger('ajaxError', {typeError: 'openModal'});
				}).always(function() {
					// отключаем прелоадер
				});

			},

			checkModal : function(modalName) {
				return this.activeModal == modalName;
			},

			closeModal : function(withOutNavigate) {
				$('div.mainmenu').css('z-index', 1040); // TODO: вынести
				this.activeModal = null;
				this.closeWithOutNavigate = withOutNavigate;
				this.$modalContainer.find('> div').modal('hide');
				$('div.modal-backdrop').remove();
			},

			openModal : function(modalName, html) {
				$('div.mainmenu').css('z-index', 1040); // TODO: вынести
				if (!this.checkModal(modalName)) {
					this.closeModal(true);
				}
				// накидываем код и пересозаём на него модал
				this.$modalContainer.html(html);
				this.$modalContainer.find('> div').modal();
				this.activeModal = modalName;
				this.closeWithOutNavigate = false;
			},

			ajaxSubmit : function(form) {
				var postData = $(form).serializeArray();
				var formURL = $(form).attr("action");
				var that = this;
				$.ajax({ url : formURL, type : "POST", data : postData,
					success : function(data, textStatus, jqXHR) {
						if (!data) {
							// вернули ничего - закрываем окошко
							that.closeModal();
							location.reload(true); // херня если пост-запрос
													// был - требует
													// подтверждения
						} else {
							// иначе перерисовываем с новым контентом
							var modal = that.activeModal;
							that.closeModal();
							that.openModal(modal, data);
							window.init();
							window.activeForm.init();
						}
					}, error : function(jqXHR, textStatus, errorThrown) {
						$(document).trigger('ajaxError', {typeError: 'submitError'});
					} });
			},

			calculateMaxModalHeight : function($mc) {
				var maximizeModal = !!$mc.find('.maximaze-modal').length;
				$mc.find('.modal-body').removeAttr('style');
				var windowHeight = $(window).height();
				var mcMarginTop = parseInt($mc.css('margin-top'));
				var modalHeight = $mc.find('.modal-dialog').outerHeight(true);
				var bodyHeight = $mc.find('.modal-body').outerHeight(true);
				var maxPossibleHeight = (windowHeight - modalHeight + bodyHeight)
					- mcMarginTop - 40;
				var options = {};

				if (maximizeModal) {
					options.height = maxPossibleHeight;
				} else {
					options.maxHeight = maxPossibleHeight;
				}

				$mc.find('.modal-body').css(options);

				if (maxPossibleHeight == $mc.find('.modal-body').outerHeight(
					true)) {
					$mc.find('.modal-body').addClass('max-size');
				} else {
					$mc.find('.modal-body').removeClass('max-size');
				}
			}

		});

	// запускаем
	window.crudApp = new App;
	// Backbone.history.start({
	// // pushState : true
	// });

});
